WebSocket কি?
WebSocket ওয়েবে রিয়েল-টাইম দ্বি-দিকনির্দেশক যোগাযোগ সক্ষম করে।
WebSocket একটি সাধারণ HTTP সার্ভারের পাশাপাশি চালানো যেতে পারে। একটি ওয়েব ব্রাউজারে একটি বোতামে ক্লিক করে, আপনি আপনার রাস্পবেরি পাইতে একটি GPIO সক্ষম করতে পারেন যা আপনার বাড়িতে আলো জ্বালাবে৷ সবকিছুই রিয়েল-টাইমে, এবং যোগাযোগ উভয় দিকেই যায়!
এই অধ্যায়ে, আমরা WebSocket সহ একটি ওয়েব সার্ভার সেট আপ করব। তারপরে আমরা একটি বোতাম দিয়ে একটি LED চালু এবং বন্ধ করার পূর্ববর্তী উদাহরণের সাথে ইন্টারঅ্যাক্ট করার জন্য একটি ব্রাউজার UI তৈরি করব।
আমার কি দরকার?
এই টিউটোরিয়ালের জন্য আপনার একটি রাস্পবেরি পাই প্রয়োজন হবে। আমাদের উদাহরণগুলিতে আমরা একটি রাস্পবেরি পাই 3 ব্যবহার করছি, তবে এই টিউটোরিয়ালটি বেশিরভাগ সংস্করণের জন্য কাজ করা উচিত।
এর জন্য আপনার প্রয়োজন:
- A Raspberry Pi with Raspian, internet, SSH, with Node.js installed
- The onoff module for Node.js
- The socket.io module for Node.js
- 1 x Breadboard
- 1 x 68 Ohm resistor
- 1 x 1k Ohm resistor
- 1 x Through Hole LED
- 1 x Push Button
- 4 x Female to male jumper wires
- 1 x Male to Male jumper wires
বিভিন্ন উপাদানের বর্ণনার জন্য উপরের তালিকার লিঙ্কগুলিতে ক্লিক করুন।
দ্রষ্টব্য:
LED এর প্রকারের উপর নির্ভর করে আপনি যে প্রতিরোধকটি ব্যবহার করছেন তা আমরা যা ব্যবহার করি তার থেকে আলাদা হতে পারে। বেশিরভাগ ছোট LED-এর জন্য শুধুমাত্র একটি ছোট রোধের প্রয়োজন হয়, প্রায় 200-500 ওহম। আপনি যে সঠিক মানটি ব্যবহার করেন তা সাধারণত গুরুত্বপূর্ণ নয়, তবে প্রতিরোধকের মান যত ছোট হবে, LED তত উজ্জ্বল হবে।
আমাদের পূর্ববর্তী উদাহরণের তুলনায়, আমাদের একমাত্র নতুন জিনিসটি একটি ওয়েব সার্ভার সেট আপ করা এবং socket.io মডিউল ইনস্টল করা।
Raspberry Pi এবং Node.js এর জন্য একটি ওয়েব সার্ভার
এই Node.js টিউটোরিয়ালের পূর্ববর্তী অধ্যায়গুলি অনুসরণ করে, আমরা একটি ওয়েব সার্ভার সেট আপ করব যা HTML ফাইলগুলি পরিবেশন করতে পারে।
আমাদের "nodetest" ডিরেক্টরিতে একটি নতুন ডিরেক্টরি তৈরি করুন যা স্ট্যাটিক html ফাইলগুলির জন্য ব্যবহার করা যেতে পারে:
pi@jassifteam:~/nodetest $ mkdir public
এখন একটি ওয়েব সার্ভার সেট আপ করা যাক. একটি Node.js ফাইল তৈরি করুন যা অনুরোধ করা ফাইলটি খোলে এবং ক্লায়েন্টকে সামগ্রী পরিবেশন করে। যদি কিছু ভুল হয়ে যায়, একটি 404 ত্রুটি নিক্ষেপ করুন।
pi@jassifteam:~/nodetest $ nano webserver.js
webserver.js:
let http = require('http').createServer(handler); //require http server, and create server with function handler()
let fs = require('fs'); //require filesystem module
http.listen(8080); //listen to port 8080
function handler (req, res) { //create server
fs.readFile(__dirname + '/public/index.html', function(err, data) { //read file index.html in public folder
if (err) {
res.writeHead(404, {'Content-Type': 'text/html'}); //display 404 on error
return res.end("404 Not Found");
}
res.writeHead(200, {'Content-Type': 'text/html'}); //write HTML
res.write(data); //write data from index.html
return res.end();
});
}
"পাবলিক" ফোল্ডারে যান:
pi@jassifteam:~/nodetest $ cd public
এবং একটি HTML ফাইল তৈরি করুন, index.html:
pi@jassifteam:~/nodetest/public $ nano index.html
index.html:
<!DOCTYPE html>
<html>
<body>
<h1>Control LED light</h1>
<input id="light" type="checkbox">LED
</body>
</html>
এই ফাইলটি এখনও কোন ফাংশন থাকবে না। আপাতত এটি শুধু একটি স্থানধারক। ওয়েব সার্ভার কাজ করছে কিনা তা দেখা যাক:
pi@jassifteam:~/nodetest/public $ cd ..
pi@jassifteam:~/nodetest $ node webserver.js
http://[RaspberryPi_IP]:8080/ :
ওয়েব সার্ভার এখন চলমান হওয়া উচিত এবং আমরা WebSocket অংশে যেতে পারি।
Node.js এর জন্য socket.io ইনস্টল করুন
ওয়েব সার্ভার সেট আপ করার সাথে সাথে, আপনার রাস্পবেরি পাই সিস্টেম প্যাকেজগুলিকে তাদের সর্বশেষ সংস্করণে আপডেট করুন৷
আপনার সিস্টেম প্যাকেজ তালিকা আপডেট করুন:
pi@jassifteam:~ $ sudo apt-get update
আপনার সমস্ত ইনস্টল করা প্যাকেজ তাদের সর্বশেষ সংস্করণে আপডেট করুন:
pi@jassifteam:~ $ sudo apt-get dist-upgrade
এটি নিয়মিত করলে আপনার রাস্পবেরি পাই ইনস্টলেশন আপডেট থাকবে।
socket.io , :
pi@jassifteam:~ $ npm install socket.io --save
আমাদের ওয়েব সার্ভারে WebSocket যোগ করা হচ্ছে
এখন আমরা আমাদের অ্যাপ্লিকেশনে WebSocket ব্যবহার করতে পারি। আমাদের index.html ফাইল আপডেট করা যাক:
index.html:
<!DOCTYPE html>
<html>
<body>
<h1>Control LED light</h1>
<p><input type="checkbox" id="light"></p>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script> <!-- include socket.io client side script -->
<script>
let socket = io(); //load socket.io-client and connect to the host that serves the page
window.addEventListener("load", function(){ //when page loads
let lightbox = document.getElementById("light");
lightbox.addEventListener("change", function() { //add event listener for when checkbox changes
socket.emit("light", Number(this.checked)); //send button status to server (as 1 or 0)
});
});
socket.on('light', function (data) { //get button status from client
document.getElementById("light").checked = data; //change checkbox according to push button on Raspberry Pi
socket.emit("light", data); //send push button status to back to server
});
</script>
</body>
</html>
এবং আমাদের webserver.js ফাইল:
webserver.js:
let http = require('http').createServer(handler); //require http server, and create server with function handler()
let fs = require('fs'); //require filesystem module
let io = require('socket.io')(http) //require socket.io module and pass the http object (server)
http.listen(8080); //listen to port 8080
function handler (req, res) { //create server
fs.readFile(__dirname + '/public/index.html', function(err, data) { //read file index.html in public folder
if (err) {
res.writeHead(404, {'Content-Type': 'text/html'}); //display 404 on error
return res.end("404 Not Found");
}
res.writeHead(200, {'Content-Type': 'text/html'}); //write HTML
res.write(data); //write data from index.html
return res.end();
});
}
io.sockets.on('connection', function (socket) {// WebSocket Connection
let lightvalue = 0; //static variable for current status
socket.on('light', function(data) { //get light switch status from client
lightvalue = data;
if (lightvalue) {
console.log(lightvalue); //turn LED on or off, for now we will just show it in console.log
}
});
});
আসুন সার্ভার পরীক্ষা করা যাক:
pi@jassifteam:~ $ node webserver.js
http://[RaspberryPi_IP]:8080/ :
এখন সার্ভারের চেকবক্সের সমস্ত পরিবর্তন রাস্পবেরি পাই-এর কনসোলে আউটপুট করা উচিত।
ক্লায়েন্ট সার্ভারে পরিবর্তন পাঠায়, এবং সার্ভার সাড়া দেয়।
আগের অধ্যায় থেকে পুশ বাটন নিয়ন্ত্রিত LED যোগ করা যাক।
হার্ডওয়্যার যোগ করা, এবং গ্রাহকের একটি প্রতিক্রিয়া পাঠানো
আমাদের webserver.js ফাইল আবার আপডেট করা যাক। আমরা PushButton নিয়ন্ত্রিত LED অধ্যায় থেকে অনেক কোড ব্যবহার করব।
webserver.js:
let http = require('http').createServer(handler); //require http server, and create server with function handler()
let fs = require('fs'); //require filesystem module
let io = require('socket.io')(http) //require socket.io module and pass the http object (server)
let Gpio = require('onoff').Gpio; //include onoff to interact with the GPIO
let LED = new Gpio(4, 'out'); //use GPIO pin 4 as output
let pushButton = new Gpio(17, 'in', 'both'); //use GPIO pin 17 as input, and 'both' button presses, and releases should be handled
http.listen(8080); //listen to port 8080
function handler (req, res) { //create server
fs.readFile(__dirname + '/public/index.html', function(err, data) { //read file index.html in public folder
if (err) {
res.writeHead(404, {'Content-Type': 'text/html'}); //display 404 on error
return res.end("404 Not Found");
}
res.writeHead(200, {'Content-Type': 'text/html'}); //write HTML
res.write(data); //write data from index.html
return res.end();
});
}
io.sockets.on('connection', function (socket) {// WebSocket Connection
let lightvalue = 0; //static variable for current status
pushButton.watch(function (err, value) { //Watch for hardware interrupts on pushButton
if (err) { //if an error
console.error('There was an error', err); //output error message to console
return;
}
lightvalue = value;
socket.emit('light', lightvalue); //send button status to client
});
socket.on('light', function(data) { //get light switch status from client
lightvalue = data;
if (lightvalue != LED.readSync()) { //only change LED if status has changed
LED.writeSync(lightvalue); //turn LED on or off
}
});
});
process.on('SIGINT', function () { //on ctrl+c
LED.writeSync(0); // Turn LED off
LED.unexport(); // Unexport LED GPIO to free resources
pushButton.unexport(); // Unexport Button GPIO to free resources
process.exit(); //exit completely
});
আসুন সার্ভার পরীক্ষা করা যাক:
pi@jassifteam:~ $ node webserver.js
http://[RaspberryPi_IP]:8080/ :
এখন সার্ভারের চেকবক্সের সমস্ত পরিবর্তন রাস্পবেরি পাই-এর কনসোলে আউটপুট করা উচিত।
ক্লায়েন্ট সার্ভারে পরিবর্তন পাঠায়, এবং সার্ভার সাড়া দেয়।
Ctrl+c দিয়ে প্রোগ্রাম শেষ করুন।